"""
不直接向客户端暴露对象创建的实现细节，而是通过一个工厂类来负责产品的实例。
"""
from abc import abstractmethod, ABCMeta


# 抽象产品角色（Product）
class Payment(metaclass=ABCMeta):
    @abstractmethod  # 抽象类，表示如果有子类继承这个父类，那么这个方法就必须要实现
    def pay(self, money):
        pass


# 	具体产品角色（Concrete Product）
class Alipay(Payment):
    """支付宝支付"""

    def __init__(self, huabei=False):
        self.huabei = huabei  # huabei=True,表示使用花呗付款

    def pay(self, money):
        if self.huabei:
            print("花呗支付%d" % money)
        else:
            print("支付宝支付%d" % money)


# 	具体产品角色（Concrete Product）
class WechatPay(Payment):
    """微信支付"""

    def pay(self, money):
        print("微信支付%d" % money)


# 工厂角色（Creator）
class PaymentFactory:
    """创建工厂类，不暴露微信支付宝支付的方法，只用输入alipay，wechat,huabei，就可以调用相应的方法.这样外部就不知道我们内部是怎么样实现的"""

    def create_payment(self, method):

        if method == "alipay":
            return Alipay()
        elif method == 'wechat':
            return WechatPay()
        elif method == "huabei":
            return Alipay(huabei=True)
        else:
            raise TypeError("No such payment named（没有这种支付方式：） %s" % method)


pf = PaymentFactory()
# 外部调用只用知道alipay，wechat,huabei，不会知道我们内部是怎么样实现的
a = pf.create_payment("huabei")
a.pay(500)
